package com.fla.millioner.ui.support;

import com.alone1672.millioner.R;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.view.WindowManager.LayoutParams;
import android.widget.Toast;
/**
 * Асинхронный таск, который показывает прогресс диалог во время своего выполнения, т. е. между вызовами методов
 * {@link #onPreExecute()} и {@link #onPostExecute(Object)}.
 * 
 * @param <Params> тип передаваемых в метод {@link #doInBackground(Object...)} параметров
 * @param <Progress> тип прогресса выполнения таска
 * @param <Result> тип возвращаемого методом {@link #doInBackground(Object...)} значения
 */
public abstract class ProgressedAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {

    private ProgressDialog progressDialog;

    private Context context;

    private Exception errorOccurred;

    public ProgressedAsyncTask(Context context) {
        super();
        this.context = context;
        progressDialog = new ProgressDialog(context, android.R.style.Theme_Panel);
    }

    protected Context getContext() {
        return context;
    }

    @Override
    protected final void onPreExecute() {

        progressDialog = ProgressDialog.show(context, "", getContext().getString(R.string.loading), false, false);
        progressDialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);
        onBeforeExecute();
    }

    @Override
    protected final void onPostExecute(Result result) {
        progressDialog.dismiss();

        if (errorOccurred != null) {
            onError(errorOccurred);

            // if (errorOccurred instanceof SevereInvalidRequestException) {
            // Utils.doLogout(getContext());
            // }
            // else if (errorOccurred instanceof InvalidRequestException) {
            // onServerError((InvalidRequestException) errorOccurred);
            // }
            // else {
            // onError(errorOccurred);
            // }
        }
        else {
            onAfterExecute(result);
        }
    }

    protected void onError(Exception e) {
        Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
    }

    @Override
    protected final void onCancelled() {
        progressDialog.dismiss();
        onCancel();
    }

    @Override
    protected final Result doInBackground(Params... params) {
        try {
            return executeInBackground(params);
        }
        catch (Exception e) {
            Log.e("test", "Error occurred during loading data", e);
            errorOccurred = e;
            return null;
        }
    }

    /**
     * Метод, вызываемый в фоновом потоке для выполнения долгих операций.
     * 
     * @param params Params параметры выполнения таска
     * @return Result результат выполнения таска
     */
    protected abstract Result executeInBackground(Params... params) throws Exception;

    /**
     * Вызывается в {@link #onPreExecute()} после отображения диалога
     * 
     * @see #onPreExecute()
     */
    protected void onBeforeExecute() {
    }

    /**
     * Вызывается в {@link #onPostExecute(Object)} после скрытия диалога
     * 
     * @param result Result
     * @see #onPostExecute(Object)
     */
    protected void onAfterExecute(Result result) {
    }

    /**
     * Вызывается в {@link AsyncTask#onCancelled} после скрытия диалога
     * 
     * @see #onCancelled()
     */
    protected void onCancel() {
    }
}
